package com.outfood.task;

/**
 * @Author huisonglin
 * @Description
 * @PackageName outfood-platform
 * @Package com.outfood.task
 * @Date 2024-03-30 10:13
 * @Version 1.0
 */

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.outfood.domain.EvaluateRecord;
import com.outfood.domain.Store;
import com.outfood.service.IEvaluateRecordSerivice;
import com.outfood.service.IStoreService;
import com.outfood.service.impl.MeiTuanOperateServiceImpl;
import com.ruoyi.common.exception.BusinessException;
import com.rys.common.enums.SearchTypeEnum;
import com.rys.common.utils.Search;
import lombok.Data;
import lombok.extern.log4j.Log4j2;
import okhttp3.*;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @Author huisonglin
 * @Description
 * @PackageName outfood-platform
 * @Package com.outfood.task
 * @Date 2024-03-25 17:08
 * @Version 1.0
 */
//@Component
@Log4j2
public class EvaluateTask {

    @Resource
    MeiTuanOperateServiceImpl meiTuanOperateService;

    @Resource
    IStoreService storeService;

    @Resource
    IEvaluateRecordSerivice evaluateRecordSerivice;

    @Scheduled(cron = "0 0 */1 * * ?")
    public void scanEvaluate() {
        long start = new Date().getTime();
        log.info("--------------------------------------------开始门店评价信息------------------------------------------------------------");
        List<Store> storeList = storeService.getList(new Search().add("storeStatus", SearchTypeEnum.EqualTo, "1").add("platform","MEITUAN").add("onlineStatus", SearchTypeEnum.EqualTo, "ONLINE"));
        storeList.forEach(store -> {
            MeiTuanOperateServiceImpl.QueryEvaluate queryEvaluate = new MeiTuanOperateServiceImpl.QueryEvaluate();
            queryEvaluate.setStoreId(store.getId());
            meiTuanOperateService.getEvaluateList(queryEvaluate);
        });
        long end = new Date().getTime();
        log.info("--------------------------------------------门店评价获取结束 总耗时{}ms------------------------------------------------------------", start - end);
    }


    @Scheduled(cron = "0 3 */1 * * ?")
    public void scanNotEvaluate() {
        long start = new Date().getTime();
        log.info("--------------------------------------------开始对用户的评价进行回复------------------------------------------------------------");
        List<EvaluateRecord> list = evaluateRecordSerivice.getList(new Search().add("replayResult", SearchTypeEnum.EqualTo, "NOT"));
        list.forEach(evaluateRecord -> {
            try {
                Store store = storeService.get(evaluateRecord.getStoreId());
                if("TRUE".equals(store.getAutoReplay())){ //开启自动回复
                    meiTuanOperateService.replay(evaluateRecord.getEvaluateId(), getComment(evaluateRecord));
                }else{
                    log.info("该门店没有开启自动回复");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
        long end = new Date().getTime();
        log.info("--------------------------------------------对用户的评价进行回复结束耗时{}ms------------------------------------------------------------", start - end);
    }
    @Resource
    RedisTemplate redisTemplate;
    static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder()               .connectTimeout(60, TimeUnit.SECONDS)  // 连接超时时间
            .writeTimeout(600, TimeUnit.SECONDS)    // 写入超时时间
            .readTimeout(600, TimeUnit.SECONDS).build();
    //通过人工智能进行回复
    public  String getComment(EvaluateRecord evaluateRecord) throws IOException {
        Boolean isRepayed = redisTemplate.opsForValue().setIfAbsent("vid:"+evaluateRecord.getId()+"", "1", 90, TimeUnit.DAYS);
        if(isRepayed){

            String prompt = "你是一个外卖商家 规则是 星级共5星 用户给的是"+evaluateRecord.getOrderCommentScore()+"星 总分是5分 " +
                    "用户给的是" + evaluateRecord.getOrderCommentScore() + "分，口味总分是5分 用户给的是" + evaluateRecord.getTasteScore() + "分，包装总分是5分用户给的是" + evaluateRecord.getPackagingScore() + "分 " +
                    "用户点的餐是： " + evaluateRecord.getFoodName() + "" +
                    "用户的评价为：   " + evaluateRecord.getComment() + "   请综合以上以外卖商家的身份给用户一个满意的口头回复不要携带XXX等字符 要求在50个字以内";
            MediaType mediaType = MediaType.parse("application/json");
            RequestBody body = RequestBody.create(mediaType, "{\"messages\":[{\"role\":\"user\",\"content\":\"" + prompt + "\"}],\"stream\":false}");
            Request request = new Request.Builder()
                    .url("https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token=" + getAccessToken())
                    .method("POST", body)
                    .addHeader("Content-Type", "application/json")
                    .build();
            Response response = HTTP_CLIENT.newCall(request).execute();
            String string = response.body().string();
            String result = JSON.parseObject(string).getString("result");
            log.info(result);
            return result;

        }
        throw  new BusinessException("该评论已进行过回复");

    }


    public static void main(String[] args) throws IOException {

        String content = "推广计划问卷调查报告单\n" +
                "名称:肝素钠注射液问卷调查\n" +
                "商家:天津生物化学制药有限公司 计划编号:20240223090354000544\n" +
                "开始时间:2024-02-23 00:00:00 结束时间:2024-02-29 23:59:59\n" +
                "最大推广:94200.00 炫金豆 完成推广:94200.00 炫金豆\n" +
                "份数:471\n" +
                "问卷调查: 200 炫金豆/每份\n" +
                "状态:已结束\n" +
                "问卷填写统计\n" +
                "您的性别是？？\n" +
                "A.男 246 票/占比 52.23%\n" +
                "B.女 203 票/占比 43.10%\n" +
                "C./ 16 票/占比 3.40%\n" +
                "D./ 6 票/占比 1.27%\n" +
                "您目前的年龄阶段是：？\n" +
                "A.20 岁以下 125 票/占比 26.54%\n" +
                "B.21-40 岁 268 票/占比 56.90%\n" +
                "C.41-60 岁 69 票/占比 14.65%\n" +
                "D.60 岁以上 9 票/占比 1.91%\n" +
                "您的文化程度是？？\n" +
                "单号:20240223090354000544 \n" +
                "A.高中及以下 188 票/占比 39.92%\n" +
                "B.大专 147 票/占比 31.21%\n" +
                "C.本科 110 票/占比 23.35%\n" +
                "D.硕士及以上 26 票/占比 5.52%\n" +
                "您目前的职业是：？\n" +
                "A.学生 116 票/占比 24.63%\n" +
                "B.职员 137 票/占比 29.09%\n" +
                "C.自由职业者 159 票/占比 33.76%\n" +
                "D.其他 59 票/占比 12.53%\n" +
                "您所在地区？\n" +
                "A.京津冀辽沪苏浙闽鲁粤桂琼 222 票/占比 47.13%\n" +
                "B.晋蒙吉黑皖赣豫鄂湘 131 票/占比 27.81%\n" +
                "C.渝川黔滇藏陕甘宁青新 77 票/占比 16.35%\n" +
                "D.港澳台 41 票/占比 8.70%\n" +
                "您更愿意使用什么类型的药物？？\n" +
                "A.针剂 103 票/占比 21.87%\n" +
                "B.口服片剂/胶囊剂 245 票/占比 52.02%\n" +
                "C.口服液 92 票/占比 19.53%\n" +
                "D.雾化药 31 票/占比 6.58%\n" +
                "您出现不适症状时，一般去哪里治疗？？\n" +
                "A.自行购药 142 票/占比 30.15%\n" +
                "B.诊所 154 票/占比 32.70%\n" +
                "C.社区医院 90 票/占比 19.11%\n" +
                "D.大医院 85 票/占比 18.05%\n" +
                "您认为肝素纳是什么类型的药物？\n" +
                "A.抗生素 190 票/占比 40.34%\n" +
                "B.抗病毒药 137 票/占比 29.09%\n" +
                "C.抗凝药 86 票/占比 18.26%\n" +
                "D.抗栓药 58 票/占比 12.31%\n" +
                "单号:20240223090354000544 \n" +
                "您认为肝素钠注射液的主要用途是什么？（可多选）？\n" +
                "A.治疗急性心肌梗死 190 票/占比 30.94%\n" +
                "B.治疗深静脉血栓形成 216 票/占比 35.18%\n" +
                "C.治疗脑血栓形成 118 票/占比 19.22%\n" +
                "D.其他用途 90 票/占比 14.66%\n" +
                "您通常在什么情况下使用肝素钠注射液？？\n" +
                "A.预防血栓形成 132 票/占比 28.03%\n" +
                "B.治疗血栓栓塞性疾病 161 票/占比 34.18%\n" +
                "C.治疗心绞痛 70 票/占比 14.86%\n" +
                "D.未使用过 108 票/占比 22.93%\n" +
                "您在使用肝素钠注射液时，注射部位的感觉如何？？\n" +
                "A.舒适，无疼痛感 146 票/占比 31.00%\n" +
                "B.轻微疼痛，可以忍受 186 票/占比 39.49%\n" +
                "C.疼痛明显，难以忍受 70 票/占比 14.86%\n" +
                "D.无疼痛感，但有其他不适感 69 票/占比 14.65%\n" +
                "您在使用肝素钠注射液时，通常会遵循哪些方面的指导？（可多选）？\n" +
                "A.医生处方及医嘱 250 票/占比 40.39%\n" +
                "B.药品说明书上的用药指导 199 票/占比 32.15%\n" +
                "C.网络搜索的信息 93 票/占比 15.02%\n" +
                "D.其他方面的指导 77 票/占比 12.44%\n" +
                "使用肝素钠注射液时，您通常会注意哪些方面的副作用？（可多选）？\n" +
                "A.出血倾向 184 票/占比 29.25%\n" +
                "B.过敏反应 198 票/占比 31.48%\n" +
                "C.骨质疏松症 112 票/占比 17.81%\n" +
                "D.其他副作用 135 票/占比 21.46%\n" +
                "您是否曾经因为不良反应而停止使用肝素钠注射液？？\n" +
                "A.是，因为不良反应严重 111 票/占比 23.57%\n" +
                "B.是，但不良反应轻微 133 票/占比 28.24%\n" +
                "C.否，没有不良反应 96 票/占比 20.38%\n" +
                "D.我从未使用过肝素钠注射液 131 票/占比 27.81%\n" +
                "单号:20240223090354000544 \n" +
                "您认为哪些人群应谨慎使用肝素钠注射液？（可多选）？\n" +
                "A.有出血倾向的患者 180 票/占比 27.73%\n" +
                "B.有血栓栓塞病史的患者 205 票/占比 31.59%\n" +
                "C.有过敏体质的患者 127 票/占比 19.57%\n" +
                "D.其他需谨慎使用的患者 137 票/占比 21.11%\n" +
                "在使用肝素钠注射液时，您认为需要注意哪些事项？（可多选）？\n" +
                "A.避免与其他药物同时使用 213 票/占比 31.28%\n" +
                "B.注意观察出血等副作用的出现 193 票/占比 28.34%\n" +
                "C.遵循医生或说明书上的用药指导 158 票/占比 23.20%\n" +
                "D.其他注意事项 117 票/占比 17.18%\n" +
                "您认为目前肝素钠注射液市场的价格水平如何？？\n" +
                "A.价格合理 178 票/占比 37.79%\n" +
                "B.价格偏高 149 票/占比 31.63%\n" +
                "C.价格偏低 62 票/占比 13.16%\n" +
                "D.其他观点 82 票/占比 17.41%\n" +
                "您认为肝素钠注射液的疗效如何？？\n" +
                "A.非常显著 133 票/占比 28.24%\n" +
                "B.较为显著 186 票/占比 39.49%\n" +
                "C.一般 107 票/占比 22.72%\n" +
                "D.没有效果 45 票/占比 9.55%\n" +
                "您认为哪些因素会影响肝素钠注射液的疗效？（可多选）？\n" +
                "A.个体差异 221 票/占比 34.32%\n" +
                "B.给药方式的不同 190 票/占比 29.50%\n" +
                "C.与其他药物的相互作用 131 票/占比 20.34%\n" +
                "D.其他因素 102 票/占比 15.84%\n" +
                "您是否会向他人推荐使用肝素钠注射液？？\n" +
                "A.会，因为疗效显著 191 票/占比 40.55%\n" +
                "B.会，因为使用方便 173 票/占比 36.73%\n" +
                "C.不会，因为疗效不明显 52 票/占比 11.04%\n" +
                "单号:20240223090354000544 \n" +
                "D.不会，因为有副作用 55 票/占比 11.68%";
        String prompt = "以下是调查问卷的目的和问题和选项以及结果：\n" +
                content +"\n"+
                "请综合以上请你以一个调查分析员的身份用一报告对每一项进行消息描述(要求在5000个字以上) ";
        MediaType mediaType = MediaType.parse("application/json");
        Queue queue = new Queue();
        queue.setStream(false);
        Message message = new Message();
        message.setRole("user");
        message.setContent(prompt);
        queue.setMessages(Arrays.asList(message));
            RequestBody body = RequestBody.create(mediaType, JSON.toJSONString(queue));
            Request request = new Request.Builder()
                    .url("https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=" + getAccessToken())
                    .method("POST", body)
                    .addHeader("Content-Type", "application/json")
                    .build();
            Response response = HTTP_CLIENT.newCall(request).execute();
            String string = response.body().string();
        System.out.println(string);
            String result = JSON.parseObject(string).getString("result");
            log.info(result);




    }

    @Data
    public static class Queue{
        private List<Message> messages;
        private Boolean stream;
    }

    @Data
    public static class Message{
        private String role;
        private String content;
    }

    public static final String API_KEY = "6fLnBiQTCHoFphC5hYc0wQPj";
    public static final String SECRET_KEY = "AxXIH4P2OHiV8anLfa1rhGXmX3E6bOvp";
    public static String getAccessToken(){
        try {
            OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();
            MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
            RequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=" + API_KEY + "&client_secret=" + SECRET_KEY);
            Request request = new Request.Builder()
                    .url("https://aip.baidubce.com/oauth/2.0/token")
                    .method("POST", body)
                    .addHeader("Content-Type", "application/x-www-form-urlencoded")
                    .build();
            Response response = HTTP_CLIENT.newCall(request).execute();
            return JSONObject.parseObject(response.body().string()).getString("access_token");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
